package com.xbts.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.xbts.common.constant.UserConstants;
import com.xbts.common.core.domain.entity.SysUser;
import com.xbts.common.core.domain.model.LoginUser;
import com.xbts.common.exception.ServiceException;
import com.xbts.common.utils.DateUtils;
import com.xbts.common.utils.SecurityUtils;
import com.xbts.common.utils.SnowFlakeUtil;
import com.xbts.common.utils.StringUtils;
import com.xbts.system.domain.SysMessage;
import com.xbts.system.domain.SysMessageUser;
import com.xbts.system.mapper.SysMessageMapper;
import com.xbts.system.service.ISysMessageService;
import com.xbts.system.service.ISysMessageUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 站内消息 Service业务层处理
 *
 * @author anhe
 * @date 2022-12-26
 */
@Service
public class SysMessageServiceImpl implements ISysMessageService {
    @Autowired
    private SysMessageMapper sysMessageMapper;

//    @Autowired
//    private SysUserMapper sysUserMapper;
//
//    @Autowired
//    private ALiSmsProperties smsProperties;

    @Autowired
    private ISysMessageUserService sysMessageUserService;

    /**
     * 查询站内消息
     *
     * @param noticeId 站内消息 主键
     * @return 站内消息
     */
    @Override
    public SysMessage selectSysMessageByNoticeId(Long noticeId) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (!loginUser.getUser().getUserType().equals(UserConstants.USER_TYPE_MANAGER)) {
            sysMessageUserService.update(new LambdaUpdateWrapper<SysMessageUser>()
                    .eq(SysMessageUser::getUserId, loginUser.getUserId())
                    .eq(SysMessageUser::getNoticeId, noticeId)
                    .set(SysMessageUser::getStatus, "1"));
        }
        return sysMessageMapper.selectSysMessageByNoticeId(noticeId);
    }

    /**
     * 查询站内消息 列表
     *
     * @param sysMessage 站内消息
     * @return 站内消息
     */
    @Override
    public List<SysMessage> selectSysMessageList(SysMessage sysMessage) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (!loginUser.getUser().getUserType().equals(UserConstants.USER_TYPE_MANAGER)) {
            sysMessage.setUserId(loginUser.getUserId().toString());
            return sysMessageMapper.selectSysMessageListByLoginUser(sysMessage);
        }
        return sysMessageMapper.selectSysMessageList(sysMessage);
    }

    /**
     * 新增站内消息
     *
     * @param sysMessage 站内消息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertSysMessage(SysMessage sysMessage) {
        sysMessage.setCreateBy(SecurityUtils.getUsername());
        sysMessage.setNoticeId(SnowFlakeUtil.getSnowFlakeId());
        sysMessageMapper.insertSysMessage(sysMessage);
        SysMessageUser sysMessageUser = new SysMessageUser();

        sysMessageUser.setUserId(sysMessage.getUserId());
        sysMessageUser.setNoticeId(sysMessage.getNoticeId().toString());
        sysMessageUser.setCreateTime(new Date());
        return sysMessageUserService.save(sysMessageUser) ? 1 : 0;
    }

    /**
     * 修改站内消息
     *
     * @param sysMessage 站内消息
     * @return 结果
     */
    @Override
    public int updateSysMessage(SysMessage sysMessage) {
        Long userId = SecurityUtils.getUserId();
        // 全部标记为已读
        if (sysMessage.getIsAll() == 2){
            sysMessage.setUserId(userId.toString());
            sysMessageUserService.update(new LambdaUpdateWrapper<SysMessageUser>()
                    .eq(SysMessageUser::getUserId, userId)
                    .set(SysMessageUser::getStatus, "1"));
        }else{
            sysMessageUserService.update(new LambdaUpdateWrapper<SysMessageUser>()
                    .eq(SysMessageUser::getUserId, userId)
                    .eq(SysMessageUser::getNoticeId, sysMessage.getNoticeId())
                    .set(SysMessageUser::getStatus, "1"));
        }
        return 1;
    }

    /**
     * 批量删除站内消息
     *
     * @param noticeIds 需要删除的站内消息 主键
     * @return 结果
     */
    @Override
    public int deleteSysMessageByNoticeIds(List<Long> noticeIds) {
        sysMessageUserService.remove(new LambdaQueryWrapper<SysMessageUser>()
                .in(SysMessageUser::getNoticeId, noticeIds));
        return sysMessageMapper.deleteSysMessageByNoticeIds(noticeIds);
    }

    /**
     * 删除站内消息 信息
     *
     * @param noticeId 站内消息 主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteSysMessageByNoticeId(Integer noticeId) {
        sysMessageUserService.remove(new LambdaQueryWrapper<SysMessageUser>()
                .eq(SysMessageUser::getNoticeId, noticeId));
        return sysMessageMapper.deleteSysMessageByNoticeId(noticeId);
    }

    @Override
    @Transactional
    public int addSysMessage(SysMessage sysMessage) {
        // 发送给平台所有人
        if (2 == sysMessage.getIsAll()) {
            List<Long> userIds = sysMessageMapper.selectMessageToUser();
            sysMessage.setUserIds(userIds);
        } else if (1 == sysMessage.getIsAll()) {
            //查询要发信息的用户
            if (StringUtils.isEmpty(sysMessage.getUserIds())) {
                throw new ServiceException("请选择要发送的用户!");
            }
        }
        Date date = new Date();
        SysMessage message = new SysMessage();
        message.setNoticeTitle(sysMessage.getNoticeTitle());
        message.setNoticeContent(sysMessage.getNoticeContent());
        message.setNoticeType(sysMessage.getNoticeType());
        String userIdsStr = sysMessage.getUserIds().stream().map(String::valueOf).collect(Collectors.joining(","));
        message.setUserId(userIdsStr);
        message.setCreateBy(SecurityUtils.getUserId().toString());
        message.setCreateTime(date);
        message.setUpdateBy(SecurityUtils.getUserId().toString());
        message.setUpdateTime(date);
        message.setNoticeId(SnowFlakeUtil.getSnowFlakeId());
        sysMessageMapper.insertSysMessage(message);
        List<SysMessageUser> list = new ArrayList<>();
        for (Long userId : sysMessage.getUserIds()) {
            SysMessageUser sysMessageUser = new SysMessageUser();
            sysMessageUser.setUserId(userId.toString());
            sysMessageUser.setNoticeId(message.getNoticeId().toString());
            sysMessageUser.setCreateTime(new Date());
            sysMessageUser.setStatus("0");
            list.add(sysMessageUser);
        }
        sysMessageUserService.saveBatch(list);
        return 1;
    }

    @Override
    public long getUnreadNum() {
        return sysMessageUserService.count(new LambdaQueryWrapper<SysMessageUser>()
                .eq(SysMessageUser::getStatus, "0")
                .eq(SysMessageUser::getUserId, SecurityUtils.getUserId()));
    }
}
